use rand::Rng;
use std::cmp::Ordering;
use std::io;
use std::{thread, time};
use std::fmt::Debug;
use std::net::{IpAddr, Ipv4Addr};

#[derive(Debug)]
enum UsState {
    Alabama,
    Alaska,
    // --snip--
}

// 硬币类型
enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter(UsState),
}

pub fn matchStudy() {
    println!("#################################");
    println!("##      match 控制流结构      ");
    println!("#################################");
    println!("match_study");

    let val = value_in_cents(Coin::Penny);
    let val = value_in_cents(Coin::Quarter(UsState::Alabama));

    let five = Some(5);
    let none = plus_one(None);
    let six = plus_one(five);
    println!("return Option Some:{}.", six.unwrap());
    println!("return Option Some:{}.", six.unwrap());

    let dice_roll = 9;
    match dice_roll {
        3 => add_fancy_hat(),
        7 => remove_fancy_hat(),
        // 匹配所有未被特殊列出的值。这种通配模式满足了 match 必须被穷尽的要求。
        // 必须将通配分支放在最后，因为模式是按顺序匹配的。
        other => move_player(other),
        // _ => do_nothing(),
        // _ => (),
    }
}


fn value_in_cents(coin: Coin) -> u8 {
    // match 关键字后跟一个表达式.
    // 和if的区别是： 对于 if，表达式必须返回一个布尔值，而这里的表达式可以是任何类型的。在这个例子中表达式是 coin 的值
    match coin {
        Coin::Penny => {
            println!("Lucky penny!");
            1
        },
        Coin::Nickel => 5,
        Coin::Dime => 10,
        Coin::Quarter(state) => {
            println!("State quarter from {:?}!", state);
            25
        },
    }
}

fn plus_one(x: Option<i32>) -> Option<i32> {
    match x {
        None => {
            println!("match Option None");
            None
        },
        Some(i) => {
            println!("match Option Some:{}.", i);
            Some(i + 1)
        },
    }
}

fn add_fancy_hat() {
    println!("match add_fancy_hat.");
}
fn remove_fancy_hat() {
    println!("match remove_fancy_hat.");
}
fn move_player(num_spaces: u8) {
    println!("match move_player:{}.", num_spaces);
}
fn do_nothing() {
}